\documentclass[12pt,a4paper]{report}
\usepackage[utf8]{inputenc}
\usepackage{graphicx}
\usepackage{ctex}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{tikz}
\usepackage{framed} 
\usepackage{fancybox}
\usepackage{subfigure}              % for \subfigure
\usepackage{float}                  % for \begin{figure}[H]
\usetikzlibrary{positioning}        % for 'below=of'
\usepackage{listings}               % for lstlisting
\usetikzlibrary{shapes.geometric}   % for shapes
\title{C Notes}
\author{thelxz}
\begin{document}
\maketitle
\lstset{
    basicstyle=\footnotesize,
    columns=fixed,       
    numbers=left,                                        % 在左侧显示行号
    numberstyle=\tiny\color{gray},                       % 设定行号格式
    frame=shadowbox,                                     % 不显示背景边框
    backgroundcolor=\color[RGB]{245,245,244},            % 设定背景颜色
    keywordstyle=\color[RGB]{40,40,255},                 % 设定关键字颜色
    numberstyle=\footnotesize\color{darkgray},           
    commentstyle=\it\color[RGB]{0,96,96},                % 设置代码注释的格式
    stringstyle=\rmfamily\slshape\color[RGB]{128,0,0},   % 设置字符串格式
    showstringspaces=false,                              % 不显示字符串中的空格
    language=c,                                        % 设置语言    
}
\chapter{Arrays}
\section{malloc二维数组}
直接malloc()的整型数组，是一维的，不能用类型a[i][j]的形式访问。如果分多次申请，每次申请一行，就可以用
行列下标的形式访问了，但是这样申请的数组在内存里不是连续的，而且释放时也需要逐个释放，比较麻烦。malloc()
其实只返回一块memory，这块memory并没有类型之分，所以我们可以把它返回的指针强制转换成二维数组。

关键问题是"二维数组"这一类型，用C语言怎么表示。可以从1维的情况推广，一维整型数组是int *，就是一个整型指针。
数组就是它元素的指针，唯一特别的是这个指针可能执行+1操作来访问它后面的元素。在申请内存时，只要把malloc()
返回的指针转化成数组元素的指针就可以了，所以整型数组用的是 int * a = (int *)malloc(sizeof(int)*N);

那二维数组的元素是什么？它的指针怎么表示？
二维数组的元素是数组，数组的指针可以用"int (*)[N]"表示。一个元素的指针怎么表示，可以先看这个元素怎么声明。
整型的表示是int i。声明一个指针就是把变量的名字前面加一个*：int (*i)。去掉变量名就是类型了： int *。
数组声明：int a[N]。数组指针声明int (*a)[N]，去掉名字就是"int (*)[N]"。

\begin{lstlisting}
int (*a)[2]=(int(*)[2])malloc(sizeof(int)*3*2);  
\end{lstlisting}

\section{二维数组作为函数参数}
由于二维数组的第二个维度不能省略，否则编译器在寻址时就不知道怎么寻址了，所以传参时要带上第二个维度。
但是如果这个函数处理的二维数组，第二个维度是不确定的呢？发现函数的参数也可以当下标:

\begin{lstlisting}
#include <stdio.h>
void printArray(int row, int col, int arrays[row][col])
{
    int i,j;
    for (i=0; i<row; i++){
        for (j=0; j<col; j++){
            printf("%d ", arrays[i][j]);
        }
        putchar('\n');
    }
}

void main(){
    int arrays[2][3] = {{11,12,13},{21,22,23}};
    int col = sizeof(arrays[0]) / sizeof(arrays[0][0]);
    int row = sizeof(arrays) / sizeof(arrays[0]);
    printArray(row,col,arrays);
}
\end{lstlisting}
因为函数内部，是不能通过sizeof()知道由参数传过来数组的大小的，所以行和列的大小都要在函数调用之前计算好并
传过去。
\end{document}